home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 24 / AACD 24.iso / AACD / Sound / LAME / WarpOS / src / mpglib / common.c next >
Encoding:
C/C++ Source or Header  |  2001-06-24  |  7.5 KB  |  325 lines

  1. /* $Id: common.c,v 1.28 2001/06/23 17:56:10 robert Exp $ */
  2.  
  3. #ifdef HAVE_CONFIG_H
  4. #include <config.h>
  5. #endif
  6.  
  7. #include <ctype.h>
  8. #include <stdlib.h>
  9. #include <signal.h>
  10.  
  11. #ifdef HAVE_FCNTL_H
  12. #include <fcntl.h>
  13. #endif
  14.  
  15. #ifdef macintosh
  16. #include   <types.h>
  17. #include   <stat.h>
  18. #else
  19. #include  <sys/types.h>
  20. #include  <sys/stat.h>
  21. #endif
  22.  
  23. #include "common.h"
  24.  
  25. #ifdef WITH_DMALLOC
  26. #include <dmalloc.h>
  27. #endif
  28.  
  29. // In C++ the array first must be prototyped, why ?
  30.  
  31. extern const int tabsel_123 [2] [3] [16];
  32.  
  33. const int tabsel_123 [2] [3] [16] = {
  34.    { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
  35.      {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
  36.      {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
  37.  
  38.    { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
  39.      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
  40.      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
  41. };
  42.  
  43. const long freqs[9] = { 44100, 48000, 32000,
  44.                         22050, 24000, 16000,
  45.                         11025, 12000,  8000 };
  46.  
  47. int bitindex;
  48. unsigned char *wordpointer;
  49. unsigned char *pcm_sample;
  50. int pcm_point = 0;
  51.  
  52.  
  53. #if defined( USE_LAYER_1 ) || defined ( USE_LAYER_2 )
  54.   real muls[27][64];
  55. #endif
  56.  
  57. #if 0
  58. static void get_II_stuff(struct frame *fr)
  59. {
  60.   static const int translate [3] [2] [16] =   /* char ? */
  61.    { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } ,
  62.        { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } ,
  63.      { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } ,
  64.        { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } ,
  65.      { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } ,
  66.        { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } };
  67.  
  68.   int table,sblim;
  69.   static const struct al_table2 *tables[5] = 
  70.        { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
  71.   static int sblims[5] = { 27 , 30 , 8, 12 , 30 };
  72.  
  73.   if(fr->lsf)
  74.     table = 4;
  75.   else
  76.     table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
  77.   sblim = sblims[table];
  78.  
  79.   fr->alloc = tables[table];
  80.   fr->II_sblimit = sblim;
  81. }
  82. #endif
  83.  
  84. #define HDRCMPMASK 0xfffffd00
  85.  
  86.  
  87. int head_check(unsigned long head,int check_layer)
  88. {
  89.   /*
  90.     look for a valid header.  
  91.     if check_layer > 0, then require that
  92.     nLayer = check_layer.  
  93.    */
  94.  
  95.   /* bits 13-14 = layer 3 */
  96.   int nLayer=4-((head>>17)&3);
  97.  
  98.   if( (head & 0xffe00000) != 0xffe00000) {
  99.     /* syncword */
  100.     return FALSE;
  101.   }
  102. #if 0
  103.   if(!((head>>17)&3)) {
  104.     /* bits 13-14 = layer 3 */
  105.     return FALSE;
  106.   }
  107. #endif
  108.  
  109.   if (3 !=  nLayer) 
  110.   {
  111.     #if defined (USE_LAYER_1) || defined (USE_LAYER_2)
  112.       if (4==nLayer)
  113.           return FALSE;
  114.     #else
  115.         return FALSE;
  116.     #endif
  117.   }
  118.  
  119.   if (check_layer>0) {
  120.       if (nLayer != check_layer) return FALSE;
  121.   }
  122.  
  123.   if( ((head>>12)&0xf) == 0xf) {
  124.     /* bits 16,17,18,19 = 1111  invalid bitrate */
  125.     return FALSE;
  126.   }
  127.   if( ((head>>10)&0x3) == 0x3 ) {
  128.     /* bits 20,21 = 11  invalid sampling freq */
  129.     return FALSE;
  130.   }
  131.   return TRUE;
  132. }
  133.  
  134.  
  135. /*
  136.  * the code a header and write the information
  137.  * into the frame structure
  138.  */
  139. int decode_header(struct frame *fr,unsigned long newhead)
  140. {
  141.  
  142.  
  143.     if( newhead & (1<<20) ) {
  144.       fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
  145.       fr->mpeg25 = 0;
  146.     }
  147.     else {
  148.       fr->lsf = 1;
  149.       fr->mpeg25 = 1;
  150.     }
  151.  
  152.     
  153.     fr->lay = 4-((newhead>>17)&3);
  154.     if( ((newhead>>10)&0x3) == 0x3) {
  155.       fprintf(stderr,"Stream error\n");
  156.       exit(1);
  157.     }
  158.     if(fr->mpeg25) {
  159.       fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
  160.     }
  161.     else
  162.       fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
  163.  
  164.     fr->error_protection = ((newhead>>16)&0x1)^0x1;
  165.  
  166.     if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */
  167.       fr->bitrate_index = ((newhead>>12)&0xf);
  168.  
  169.     fr->bitrate_index = ((newhead>>12)&0xf);
  170.     fr->padding   = ((newhead>>9)&0x1);
  171.     fr->extension = ((newhead>>8)&0x1);
  172.     fr->mode      = ((newhead>>6)&0x3);
  173.     fr->mode_ext  = ((newhead>>4)&0x3);
  174.     fr->copyright = ((newhead>>3)&0x1);
  175.     fr->original  = ((newhead>>2)&0x1);
  176.     fr->emphasis  = newhead & 0x3;
  177.  
  178.     fr->stereo    = (fr->mode == MPG_MD_MONO) ? 1 : 2;
  179.  
  180.     switch(fr->lay)
  181.     {
  182. #ifdef USE_LAYER_1
  183.       case 1:
  184.         fr->framesize  = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
  185.         fr->framesize /= freqs[fr->sampling_frequency];
  186.         fr->framesize  = ((fr->framesize+fr->padding)<<2)-4;
  187.         fr->down_sample=0;
  188.         fr->down_sample_sblimit = SBLIMIT>>(fr->down_sample);
  189.         break;
  190. #endif
  191. #ifdef USE_LAYER_2
  192.       case 2:
  193.         fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
  194.         fr->framesize /= freqs[fr->sampling_frequency];
  195.         fr->framesize += fr->padding - 4;
  196.         fr->down_sample=0;
  197.         fr->down_sample_sblimit = SBLIMIT>>(fr->down_sample);
  198.         break;
  199. #endif
  200.       case 3:
  201. #if 0
  202.         fr->do_layer = do_layer3;
  203.         if(fr->lsf)
  204.           ssize = (fr->stereo == 1) ? 9 : 17;
  205.         else
  206.           ssize = (fr->stereo == 1) ? 17 : 32;
  207. #endif
  208.  
  209. #if 0
  210.         if(fr->error_protection)
  211.           ssize += 2;
  212. #endif
  213.     if (fr->bitrate_index==0)
  214.       fr->framesize=0;
  215.     else{
  216.           fr->framesize  = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
  217.           fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf);
  218.           fr->framesize = fr->framesize + fr->padding - 4;
  219.     }
  220.         break; 
  221.       default:
  222.         fprintf(stderr,"Sorry, layer %d not supported\n",fr->lay); 
  223.         return (0);
  224.     }
  225.     /*    print_header(fr); */
  226.  
  227.     return 1;
  228. }
  229.  
  230.  
  231. #if 1
  232. void print_header(struct frame *fr)
  233. {
  234.     static const char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
  235.     static const char *layers[4] = { "Unknown" , "I", "II", "III" };
  236.  
  237.     fprintf(stderr,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", 
  238.         fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
  239.         layers[fr->lay],freqs[fr->sampling_frequency],
  240.         modes[fr->mode],fr->mode_ext,fr->framesize+4);
  241.     fprintf(stderr,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
  242.         fr->stereo,fr->copyright?"Yes":"No",
  243.         fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
  244.         fr->emphasis);
  245.     fprintf(stderr,"Bitrate: %d Kbits/s, Extension value: %d\n",
  246.         tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension);
  247. }
  248.  
  249. void print_header_compact(struct frame *fr)
  250. {
  251.     static const char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
  252.     static const char *layers[4] = { "Unknown" , "I", "II", "III" };
  253.  
  254.     fprintf(stderr,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
  255.         fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
  256.         layers[fr->lay],
  257.         tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
  258.         freqs[fr->sampling_frequency], modes[fr->mode]);
  259. }
  260.  
  261. #endif
  262.  
  263. unsigned int getbits(int number_of_bits)
  264. {
  265.   unsigned long rval;
  266.  
  267.   if(!number_of_bits)
  268.     return 0;
  269.  
  270.   {
  271.     rval = wordpointer[0];
  272.     rval <<= 8;
  273.     rval |= wordpointer[1];
  274.     rval <<= 8;
  275.     rval |= wordpointer[2];
  276.     rval <<= bitindex;
  277.     rval &= 0xffffff;
  278.  
  279.     bitindex += number_of_bits;
  280.  
  281.     rval >>= (24-number_of_bits);
  282.  
  283.     wordpointer += (bitindex>>3);
  284.     bitindex &= 7;
  285.   }
  286.   return rval;
  287. }
  288.  
  289. unsigned int getbits_fast(int number_of_bits)
  290. {
  291.   unsigned long rval;
  292.  
  293.   {
  294.     rval = wordpointer[0];
  295.     rval <<= 8;    
  296.     rval |= wordpointer[1];
  297.     rval <<= bitindex;
  298.     rval &= 0xffff;
  299.     bitindex += number_of_bits;
  300.  
  301.     rval >>= (16-number_of_bits);
  302.  
  303.     wordpointer += (bitindex>>3);
  304.     bitindex &= 7;
  305.   }
  306.   return rval;
  307. }
  308.  
  309.  
  310. int set_pointer( PMPSTR mp, long backstep)
  311. {
  312.   unsigned char *bsbufold;
  313.  
  314.   if(mp->fsizeold < 0 && backstep > 0) {
  315.     fprintf(stderr,"Can't step back %ld!\n",backstep);
  316.     return MP3_ERR; 
  317.   }
  318.   bsbufold = mp->bsspace[1-mp->bsnum] + 512;
  319.   wordpointer -= backstep;
  320.   if (backstep)
  321.     memcpy(wordpointer,bsbufold+mp->fsizeold-backstep,(size_t)backstep);
  322.   bitindex = 0;
  323.   return MP3_OK;
  324. }
  325.